package net.lgy.apitest.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import net.lgy.apitest.model.DO.ApiTestCaseDO;
import net.lgy.apitest.service.ApiTestCaseService;
import net.lgy.util.JsonData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * API测试用例Controller
 */
@RestController
@RequestMapping("/api/test-case/v1")
@Tag(name = "API测试用例管理", description = "API测试用例的增删改查操作")
public class ApiTestCaseController {

    @Autowired
    private ApiTestCaseService apiTestCaseService;

    /**
     * 新增测试用例
     */
    @PostMapping
    @Operation(summary = "新增测试用例", description = "创建一个新的API测试用例")
    public JsonData createTestCase(@RequestBody ApiTestCaseDO testCaseDO, @RequestHeader("accountNo") Long accountNo) {
        testCaseDO.setAccountNo(accountNo);
        boolean result = apiTestCaseService.save(testCaseDO);
        if (result) {
            // 直接返回保存的DO对象
            return JsonData.buildSuccess(testCaseDO);
        }
        return JsonData.buildError("创建测试用例失败");
    }

    /**
     * 更新测试用例
     */
    @PutMapping("/{id}")
    @Operation(summary = "更新测试用例", description = "更新指定ID的API测试用例")
    public JsonData updateTestCase(@PathVariable Long id, @RequestBody ApiTestCaseDO testCaseDO, @RequestHeader("accountNo") Long accountNo) {
        testCaseDO.setId(id);
        testCaseDO.setAccountNo(accountNo);
        boolean result = apiTestCaseService.updateById(testCaseDO);
        if (result) {
            // 直接获取并返回DO对象
            ApiTestCaseDO updatedDO = apiTestCaseService.getById(id);
            return JsonData.buildSuccess(updatedDO);
        }
        return JsonData.buildError("更新测试用例失败");
    }

    /**
     * 删除测试用例
     */
    @DeleteMapping("/{id}")
    @Operation(summary = "删除测试用例", description = "删除指定ID的API测试用例")
    public JsonData deleteTestCase(@PathVariable Long id, @RequestHeader("accountNo") Long accountNo) {
        // 先验证权限，然后删除
        ApiTestCaseDO testCaseDO = apiTestCaseService.getById(id);
        if (testCaseDO != null && testCaseDO.getAccountNo().equals(accountNo)) {
            boolean result = apiTestCaseService.removeById(id);
            return result ? JsonData.buildSuccess("删除成功") : JsonData.buildError("删除失败");
        }
        return JsonData.buildError("无权限删除该测试用例");
    }

    /**
     * 获取测试用例详情
     */
    @GetMapping("/{id}")
    @Operation(summary = "获取测试用例详情", description = "根据ID获取API测试用例的详细信息")
    public JsonData getTestCase(@PathVariable Long id, @RequestHeader("accountNo") Long accountNo) {
        ApiTestCaseDO testCaseDO = apiTestCaseService.getById(id);
        if (testCaseDO != null && testCaseDO.getAccountNo().equals(accountNo)) {
            return JsonData.buildSuccess(testCaseDO);
        }
        return JsonData.buildError("测试用例不存在或无权限访问");
    }

    /**
     * 获取所有测试用例
     */
    @GetMapping("/list")
    @Operation(summary = "获取所有测试用例", description = "获取所有API测试用例列表")
    public JsonData listTestCases(@RequestHeader("accountNo") Long accountNo) {
        List<ApiTestCaseDO> testCases = apiTestCaseService.getByAccountNo(accountNo);
        return JsonData.buildSuccess(testCases);
    }
    
    /**
     * 根据分类ID获取测试用例
     */
    @GetMapping("/category/{categoryId}")
    @Operation(summary = "根据分类获取测试用例", description = "获取指定分类下的所有API测试用例")
    public JsonData listTestCasesByCategory(@PathVariable Long categoryId, @RequestHeader("accountNo") Long accountNo) {
        List<ApiTestCaseDO> testCases = apiTestCaseService.getByCategoryId(categoryId, accountNo);
        return JsonData.buildSuccess(testCases);
    }
}